package Levels
{
	import flash.display.MovieClip;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.media.Sound;
	import flash.media.SoundChannel;
	import flash.text.TextField;
	import flash.text.TextFormat;
	import Objetos.Heroi;
	/**
	 * ...
	 * @author Leandro Moreira Lopes
	 */
	public class Level extends MovieClip
	{
		protected var MC_heroi					:Heroi;					/** * variavel do heroi*/
		protected var MC_background				:MovieClip;				/** * variavel do background*/
		protected var MC_upgrade				:MovieClip;				/** * variavel do upgrade*/
		protected var MC_HP1					:MovieClip;				/** * variavel da barra de HP do heroi 1*/
		protected var MC_HP2					:MovieClip;				/** * variavel da barra de HP do heroi 2*/
		
		
		public static var AR_tiros				:Array = new Array();	/** * array dos tiros*/
		public static var AR_herois				:Array = new Array();	/** * array dos herois*/
		
		
		public var TipoUpgradeS					:String;				/** * variavel que vai identificar qual o a funcao do upgrade que apareceu na tela*/
		public var nave1						:String;				/** * variavel que identifica qual a nave do jogador 1*/
		public var nave2						:String;				/** * variavel que identifica qual a nave do jogador 2*/
		
		public var campoTexto					:TextField = new TextField();		/** * variaveis de texto para o placar*/
		public var formatoTexto					:TextFormat = new TextFormat();
		
		
		public function Level() 
		{
			formatoTexto.align = "center";								/** * configurações do placar*/
			formatoTexto.size = 40;
			formatoTexto.bold = true;
			formatoTexto.italic = false;
			formatoTexto.font = "Arial";
			campoTexto.defaultTextFormat = formatoTexto;
			campoTexto. textColor = 0xFFFFFF
			campoTexto.width = 100;
			campoTexto.height = 50;
			campoTexto.x = 350;
			campoTexto.y = 10;
			campoTexto.border = false;
			campoTexto.selectable = false;
			campoTexto.background = false;
			
			nave1 = Main.getInstance()._nave1;							/** * variaveis foram locadas na main pois o menu precisava delas ja criadas para poder alterar*/
			nave2 = Main.getInstance()._nave2;
			
		}
	
		
		public function update():void
		{
			for each (MC_heroi in AR_herois)							/** * chamar o update dos herois*/
			{
				MC_heroi.update();
			}
			
			for (var a:uint = 0; a < AR_tiros.length; a++)				/** * chamar o update dos tiros*/
			{
				AR_tiros[a].update();
			}
			
			for (var e:uint = 0; e < AR_tiros.length; e++)				/** * remover os tiros que vao para fora da tela*/
			{
				if (AR_tiros[e].x > Main.getInstance().stage.stageWidth + 20)
				{
					Main.getInstance().MC_tela.removeChild(AR_tiros[e]);
					AR_tiros.splice(e, 1);
					break;
				}
				
				else if (AR_tiros[e].y > Main.getInstance().stage.stageHeight + 20)
				{
					Main.getInstance().MC_tela.removeChild(AR_tiros[e]);
					AR_tiros.splice(e, 1);
					break;
				}
				
				else if (AR_tiros[e].x < 20)
				{
					Main.getInstance().MC_tela.removeChild(AR_tiros[e]);
					AR_tiros.splice(e, 1);
					break;
				}
				
				else if (AR_tiros[e].y < 20)
				{
					Main.getInstance().MC_tela.removeChild(AR_tiros[e]);
					AR_tiros.splice(e, 1);
					break;
				}
			}
			
			colidirTiroHeroi();
			colidirHeroiHeroi();
			colidirHeroiUpgrade();
			//colidirTiroUpgrade();					ainda não funcional
			HPdosHerois();
			terminarJogo();
			campoTexto.text = Main.getInstance().pontoJ1 + ":" + Main.getInstance().pontoJ2;				/** * atualização do placar a cada quadro*/
		}
		
		
		public function colidirTiroHeroi():void				/** * colisão do heroi com o tiro*/
		{
			for (var b:uint = 0; b < AR_herois.length; b++)
			{
				if (AR_herois[b].UI_vida <= 0)				/** * caso o hp do heroi zere, o mesmo e removido*/ 
				{
					AR_herois[b].removerListener();
					Main.getInstance().MC_tela.removeChild(AR_herois[b]);
					AR_herois.splice(b, 1);
					break;
				}
				
				for (var c:uint = 0; c < AR_tiros.length; c++)	/** * colisao propriamente dita*/
				{
					if (AR_herois[b].hitTestObject(AR_tiros[c]) && (AR_herois[b].UI_player != AR_tiros[c].UI_player))
					{
						AR_herois[b].UI_vida -= AR_tiros[c].UI_forca;
						AR_herois[b].naveEscolhida.alpha = 0.5;								/** * heroi (a skin) diminui o alpha durante a colisao, para piscar*/
						Main.getInstance().MC_tela.removeChild(AR_tiros[c]);
						AR_tiros.splice(c, 1);
					}
				}
			}
		}
		
		
		public function colidirHeroiHeroi():void	/** * colisao dos herois*/
		{
			if (AR_herois.length == 2)				/** so faz o teste caso ambos os herois ainda estejam na tela*/
			{
				if (AR_herois[0].hitTestObject(AR_herois[1]))
				{
					AR_herois[0].UI_vida -= 1;
					AR_herois[1].UI_vida -= 1;
					AR_herois[0].naveEscolhida.alpha = 0.5;		/** * heroi (a skin) diminui o alpha durante a colisao*/
					AR_herois[1].naveEscolhida.alpha = 0.5;
				}
			}
		}
		
		
		public function colidirHeroiUpgrade():void		/** *colisao do heroi com o upgrade*/
		{
			for each (MC_heroi in AR_herois)
			{
				if (MC_upgrade!= null && MC_heroi.hitTestObject(MC_upgrade))
				{
					if (TipoUpgradeS == "POWERUP")								/** * caso de upgrade de força*/
					{	
						Main.getInstance().MC_tela.removeChild(MC_upgrade);		/** * remove o upgrade da tela e da memoria*/
						MC_upgrade = null;
						MC_heroi.BO_pegouUpgrade = true;						/** * torna a boleana verdadeira e reinicia o contador da boleana*/
						MC_heroi.UI_tempoComUpgrade = 600;
					}
					
					else if (TipoUpgradeS == "HPUP")							/** * case de upgrade que recupere HP*/
					{	
						Main.getInstance().MC_tela.removeChild(MC_upgrade);		/** * remove o upgrade da tela e da memoria*/
						MC_upgrade = null;
						MC_heroi.UI_tempoComUpgrade = 600;
						MC_heroi.UI_vida += 40;									/** * recupera 40 do UI_vida*/
						if (MC_heroi.UI_vida > MC_heroi.UI_vidaMAX)
						{
							MC_heroi.UI_vida = MC_heroi.UI_vidaMAX;				/** * para a vida nao ficar maior que o UI_vidaMAX*/
						}
					}
				}
			}
		}
		
		
		/*public function colidirTiroUpgrade():void
		{
			if (AR_tiros.length != 0 && MC_upgrade != null)
			{
				for (var d:uint = 0; d < AR_tiros.length; d++)
				{
					if (AR_tiros[d].hitTestObject(MC_upgrade))
					{
						Main.getInstance().MC_tela.removeChild(AR_tiros[d]);
						Main.getInstance().MC_tela.removeChild(MC_upgrade);
						MC_upgrade = null;
					}
				}
			}
		}*/
		
		
		public function HPdosHerois():void				/** * atualiza as barras de HP dos herois*/
		{
			if (AR_herois.length == 2)
			{
				MC_HP1.scaleX = AR_herois[0].UI_vida / AR_herois[0].UI_vidaMAX;
				MC_HP2.scaleX = AR_herois[1].UI_vida / AR_herois[1].UI_vidaMAX;
			}
		}
		
		
		public function terminarJogo():void				/** * função terminar jogo caso um dos herois morra*/
		{
			for (var f:uint = 0; f < AR_herois.length; f++)
			{
				if (AR_herois[f].UI_vida <= 0)
				{		
					if (f == 0)
					{
						Main.getInstance().pontoJ2++;		/** * caso jogador morto seja o jogador 1, ponto para o jogador 2*/
					}
					
					else if (f == 1)
					{
						Main.getInstance().pontoJ1++;		/** * caso jogador morto seja o jogador 2, ponto para o jogador 1*/
					}
					
					AR_herois[0].removerListener();		/** * removendo os eventos de controle e updates dos herois*/
					AR_herois[1].removerListener();
					AR_herois[0].UI_vida = AR_herois[0].UI_vidaMAX;			/** * reseta o HP dos herois*/
					AR_herois[1].UI_vida = AR_herois[1].UI_vidaMAX;
					
					AR_herois.length = 0;									/** * limpando as arrays*/
					AR_tiros.length = 0;
					
					Main.getInstance().removeChild(Main.getInstance().MC_tela);		/** * removendo tudo da tela*/
					Main.getInstance().MC_tela = null;
					Main.getInstance().removeEventListener(Event.ENTER_FRAME, Main.getInstance().update); /** * removendo update*/
					
					if (Main.getInstance().pontoJ1 == 5 || Main.getInstance().pontoJ2 == 5)		/** * caso algum dos jogadores alcance 5 pontos, o jogo acaba*/
					{
						Main.getInstance().mainMenu.gameOver();									/** * funcao gameOver da classe menu sendo chamada*/
						break;
					}
					
					Main.getInstance().iniciarJogo()							/** chama função da classe Main*/
				}
			}
		}
	}
}